home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 December / december_2000.iso / Intercd / root / Multimedia / audio / ^NoiseTracker / NtkSourceCode / alphasynth.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-12-09  |  22.8 KB  |  1,187 lines

  1. /*
  2. CMachineParameter const paraSM = 
  3.     pt_byte,                                        // type
  4.     "SyntheSys",
  5.     "SyntheSys",                                    // description
  6.     0,                                                // MinValue    
  7.     4,                                                // MaxValue
  8.     255,                                            // NoValue
  9.     MPF_STATE,                                        // Flags
  10.     0
  11. };
  12.  
  13.  
  14. CMachineParameter const paraOSC1 = 
  15.     pt_byte,                                        // type
  16.     "OSC1 Waveform",
  17.     "OSC1 Waveform",                                // description
  18.     0,                                                // MinValue    
  19.     8,                                                // MaxValue
  20.     255,                                            // NoValue
  21.     MPF_STATE,                                        // Flags
  22.     1
  23. };
  24.  
  25. CMachineParameter const paraPW1 = 
  26.     pt_word,                                        // type
  27.     "PW1",
  28.     "PW1",                                        // description
  29.     0,                                                // MinValue    
  30.     512,                                            // MaxValue
  31.     65535,                                            // NoValue
  32.     MPF_STATE,                                        // Flags
  33.     256
  34. };
  35.  
  36. CMachineParameter const paraOSC2 = 
  37.     pt_byte,                                        // type
  38.     "OSC2 Waveform",
  39.     "OSC2 Waveform",                                // description
  40.     0,                                                // MinValue    
  41.     8,                                                // MaxValue
  42.     255,                                            // NoValue
  43.     MPF_STATE,                                        // Flags
  44.     1
  45. };
  46.  
  47.  
  48. CMachineParameter const paraPW2 = 
  49.     pt_word,                                        // type
  50.     "PW2",
  51.     "PW2",                                        // description
  52.     0,                                                // MinValue    
  53.     512,                                            // MaxValue
  54.     65535,                                            // NoValue
  55.     MPF_STATE,                                        // Flags
  56.     256
  57. };
  58.  
  59. CMachineParameter const paraNoise = 
  60.     pt_byte,                                        // type
  61.     "Noise",
  62.     "Noise",                                // description
  63.     0,                                                // MinValue    
  64.     128,                                                // MaxValue
  65.     255,                                            // NoValue
  66.     MPF_STATE,                                        // Flags
  67.     0
  68. };
  69.  
  70. CMachineParameter const paraFine = 
  71.     pt_byte,                                        // type
  72.     "OSC2 Fine",
  73.     "OSC2 Fine",                                    // description
  74.     0,                                                // MinValue    
  75.     128,                                            // MaxValue
  76.     255,                                            // NoValue
  77.     MPF_STATE,                                        // Flags
  78.     64
  79. };
  80.  
  81. CMachineParameter const paraDetune = 
  82.     pt_byte,                                        // type
  83.     "OSC2 Detune",
  84.     "OSC2 Detune",                                    // description
  85.     0,                                                // MinValue    
  86.     128,                                            // MaxValue
  87.     255,                                            // NoValue
  88.     MPF_STATE,                                        // Flags
  89.     64
  90. };
  91.  
  92.  
  93. CMachineParameter const paraENV1_A = 
  94.     pt_word,                                        // type
  95.     "ENV1 Attack",
  96.     "ENV1 Attack",                                    // description
  97.     1,                                                // MinValue    
  98.     2048,                                            // MaxValue
  99.     0,                                            // NoValue
  100.     MPF_STATE,                                        // Flags
  101.     32
  102. };
  103.  
  104.  
  105. CMachineParameter const paraENV1_D = 
  106.     pt_word,                                        // type
  107.     "ENV1 Decay",
  108.     "ENV1 Decay",                                    // description
  109.     1,                                                // MinValue    
  110.     2048,                                            // MaxValue
  111.     0,                                            // NoValue
  112.     MPF_STATE,                                        // Flags
  113.     148
  114. };
  115.  
  116. CMachineParameter const paraENV1_S = 
  117.     pt_byte,                                        // type
  118.     "ENV1 Sustain",
  119.     "ENV1 Sustain",                                    // description
  120.     0,                                                // MinValue    
  121.     128,                                            // MaxValue
  122.     255,                                            // NoValue
  123.     MPF_STATE,                                        // Flags
  124.     32
  125. };
  126.  
  127. CMachineParameter const paraENV1_R = 
  128.     pt_word,                                        // type
  129.     "ENV1 Release",
  130.     "ENV1 Release",                                    // description
  131.     1,                                            // MinValue    
  132.     2048,                                            // MaxValue
  133.     0,                                            // NoValue
  134.     MPF_STATE,                                        // Flags
  135.     148
  136. };
  137.  
  138. CMachineParameter const paraLfo = 
  139.     pt_word,                                        // type
  140.     "LFO1 Period",
  141.     "LFO1 Period",                // description
  142.     0,                                                // MinValue    
  143.     2048,                                            // MaxValue
  144.     65535,                                            // NoValue
  145.     MPF_STATE,                                        // Flags
  146.     16
  147. };
  148.  
  149. CMachineParameter const paraLfo2 = 
  150.     pt_word,                                        // type
  151.     "LFO2 Period",
  152.     "LFO2 Period",                // description
  153.     0,                                                // MinValue    
  154.     2048,                                            // MaxValue
  155.     65535,                                            // NoValue
  156.     MPF_STATE,                                        // Flags
  157.     16
  158. };
  159.  
  160. CMachineParameter const paraVCF_Cutoff = 
  161.     pt_byte,                                        // type
  162.     "VCF Cutoff",
  163.     "VCF Cutoff",                                    // description
  164.     0,                                            // MinValue    
  165.     128,                                            // MaxValue
  166.     255,                                            // NoValue
  167.     MPF_STATE,                                        // Flags
  168.     128
  169. };
  170.  
  171.  
  172. CMachineParameter const paraVCF_Resonance = 
  173.     pt_byte,                                        // type
  174.     "VCF Q",
  175.     "VCF Q",                                    // description
  176.     0,                                            // MinValue    
  177.     128,                                            // MaxValue
  178.     255,                                            // NoValue
  179.     MPF_STATE,                                        // Flags
  180.     0
  181. };
  182.  
  183.  
  184. CMachineParameter const paraVCF_HPF = 
  185.     pt_byte,                                        // type
  186.     "VCF Type",
  187.     "VCF Type",                                    // description
  188.     0,                                            // MinValue    
  189.     5,                                            // MaxValue
  190.     255,                                            // NoValue
  191.     MPF_STATE,                                        // Flags
  192.     0
  193. };
  194.  
  195. CMachineParameter const paraENV1TOVCF = 
  196.     pt_byte,                                        // type
  197.     "VCF>ENV1",
  198.     "VCF>ENV1",                                    // description
  199.     0,                                            // MinValue    
  200.     128,                                            // MaxValue
  201.     255,                                            // NoValue
  202.     MPF_STATE,                                        // Flags
  203.     64
  204. };
  205.  
  206. CMachineParameter const paraLFOTOVCF = 
  207.     pt_byte,                                        // type
  208.     "VCF>LFO1",
  209.     "VCF>LFO1",                                    // description
  210.     0,                                            // MinValue    
  211.     128,                                            // MaxValue
  212.     255,                                            // NoValue
  213.     MPF_STATE,                                        // Flags
  214.     64
  215. };
  216.  
  217. CMachineParameter const paraLFOTOVCF2 = 
  218.     pt_byte,                                        // type
  219.     "VCF>LFO2",
  220.     "VCF>LFO2",                                    // description
  221.     0,                                            // MinValue    
  222.     128,                                            // MaxValue
  223.     255,                                            // NoValue
  224.     MPF_STATE,                                        // Flags
  225.     64
  226. };
  227.  
  228. CMachineParameter const paraLFO1TOPW1 = 
  229.     pt_byte,                                        // type
  230.     "PW1>LFO1",
  231.     "PW1>LFO1",                                    // description
  232.     0,                                            // MinValue    
  233.     128,                                            // MaxValue
  234.     255,                                            // NoValue
  235.     MPF_STATE,                                        // Flags
  236.     64
  237. };
  238.  
  239. CMachineParameter const paraLFO2TOPW1 = 
  240.     pt_byte,                                        // type
  241.     "PW1>LFO2",
  242.     "PW1>LFO2",                                    // description
  243.     0,                                            // MinValue    
  244.     128,                                            // MaxValue
  245.     255,                                            // NoValue
  246.     MPF_STATE,                                        // Flags
  247.     64
  248. };
  249.  
  250. CMachineParameter const paraLFO1TOPW2 = 
  251.     pt_byte,                                        // type
  252.     "PW2>LFO1",
  253.     "PW2>LFO1",                                    // description
  254.     0,                                            // MinValue    
  255.     128,                                            // MaxValue
  256.     255,                                            // NoValue
  257.     MPF_STATE,                                        // Flags
  258.     64
  259. };
  260.  
  261. CMachineParameter const paraLFO2TOPW2 = 
  262.     pt_byte,                                        // type
  263.     "PW2>LFO2",
  264.     "PW2>LFO2",                                    // description
  265.     0,                                            // MinValue    
  266.     128,                                            // MaxValue
  267.     255,                                            // NoValue
  268.     MPF_STATE,                                        // Flags
  269.     64
  270. };
  271.  
  272. CMachineParameter const paraGlide = 
  273.     pt_byte,                                        // type
  274.     "Glide",
  275.     "Glide Amount",                                    // description
  276.     0,                                                // MinValue    
  277.     128,                                            // MaxValue
  278.     255,                                            // NoValue
  279.     MPF_STATE,                                        // Flags
  280.     0
  281. };
  282.  
  283. CMachineParameter const paraNote = 
  284.     pt_note,                                        // type
  285.     "Note",
  286.     "Note",                                            // description
  287.     NOTE_MIN,                                             // MinValue    
  288.     NOTE_MAX,                                                  // MaxValue
  289.     NOTE_NO,                                        // NoValue
  290.     0,                                                // Flags
  291.     0
  292. };
  293.  
  294. CMachineParameter const paraVolume = 
  295.     pt_byte,                                        // type
  296.     "Volume",
  297.     "Volume [sustain level] (0=0%, 80=100%, FE=~200%)",    // description
  298.     0,                                                // MinValue    
  299.     0xfe,                                              // MaxValue
  300.     0xff,                                            // NoValue
  301.     0,                                        // Flags
  302.     0x80
  303. };
  304.  
  305. CMachineParameter const *pParameters[] = { 
  306.     // global
  307.     ¶SM,
  308.     ¶OSC1,
  309.     ¶PW1,
  310.     ¶OSC2,
  311.     ¶PW2,
  312.     ¶Noise,
  313.     ¶Fine,
  314.     ¶Detune,
  315.     ¶ENV1_A,
  316.     ¶ENV1_D,
  317.     ¶ENV1_S,
  318.     ¶ENV1_R,
  319.     ¶Lfo,
  320.     ¶Lfo2,
  321.     ¶VCF_Cutoff,
  322.     ¶VCF_Resonance,
  323.     ¶VCF_HPF,
  324.     ¶ENV1TOVCF,
  325.     ¶LFOTOVCF,
  326.     ¶LFOTOVCF2,
  327.     ¶LFO1TOPW1,
  328.     ¶LFO2TOPW1,
  329.     ¶LFO1TOPW2,
  330.     ¶LFO2TOPW2,
  331.     ¶Glide,
  332.     
  333.     // track
  334.     ¶Note,
  335.     ¶Volume
  336. };
  337.  
  338. #pragma pack(1)
  339.  
  340. class gvals
  341. {
  342. public:
  343. byte sm;
  344. byte osc1;
  345. word pw1;
  346. byte osc2;
  347. word pw2;
  348. byte noise;
  349. byte fine;
  350. byte detune;
  351. word env1_a;
  352. word env1_d;
  353. byte env1_s;
  354. word env1_r;
  355. word lfo;
  356. word lfo2;
  357. byte vcf_cutoff;
  358. byte vcf_resonance;
  359. byte vcf_hpf;
  360. byte env1tovcf;
  361. byte lfotovcf;
  362. byte lfotovcf2;
  363. byte lfo1topw1;
  364. byte lfo2topw1;
  365. byte lfo1topw2;
  366. byte lfo2topw2;
  367. byte glide;
  368. };
  369.  
  370. class tvals
  371. {
  372. public:
  373.     byte note;
  374.     byte volume;
  375. };
  376.  
  377. #pragma pack()
  378.  
  379. CMachineInfo const MacInfo = 
  380. {
  381.     MT_GENERATOR,                            // type
  382.     MI_VERSION,
  383.     0,                                        // flags
  384.     1,                                        // min tracks
  385.     MAX_TRACKS,                                // max tracks
  386.     25,                                        // numGlobalParameters
  387.     2,                                        // numTrackParameters
  388.     pParameters,
  389.     0, 
  390.     NULL,
  391. #ifdef _DEBUG
  392.     "Arguelles Alpha (Debug build)",            // name
  393. #else
  394.     "Arguelles Alpha",
  395. #endif
  396.     "Alpha",                                    // short name
  397.     "Juan Antonio Arguelles Rius",             // author
  398.     NULL
  399. };
  400.  
  401. class Alphatrack
  402. {
  403. public:
  404.     mi();
  405.     virtual ~mi();
  406.     
  407.     virtual float Filter(char c,float input,float f,float q);
  408.     virtual float Filter2( float x, char i);
  409.     virtual void MakeBW(void);
  410.     float Kutoff( int v);
  411.     float Reonance( float v);
  412.     float Bandwidth( int v);
  413.     void ComputeCoefs(int freq, int r, int t);
  414.  
  415.     virtual void Init(CMachineDataInput * const pi);
  416.     virtual void Tick();
  417.     virtual bool Work(float *psamples, int numsamples, int const mode);
  418.     virtual void SetNumTracks(int const n) { numTracks = n; }
  419.     virtual void Stop();
  420.     virtual void InitWavetable();
  421.     virtual void SynthNote(char channel,float note);
  422.     virtual float SynthWork(char channel);
  423.     virtual float ADSR_Coef(float sustain,int stage);
  424.     virtual void LfoAdvance(void);
  425.     virtual int f2i(double d);
  426.     virtual char const *DescribeValue(int const param, int const value);
  427.     virtual float GetS(int type,float offset, float pwi);
  428.  
  429. public:
  430.     int numTracks;
  431.     gvals gval;
  432.     tvals tval;
  433.     float SineTable[600];
  434.     float coef[5];
  435.     float coeftab[5][128][128][5];
  436.     float OSC1_Step;
  437.     float OSC2_Step;
  438.     int ENV1_A;
  439.     int ENV1_D;
  440.     float ENV1_S;
  441.     int ENV1_R;
  442.     float buf0;
  443.     float buf1;
  444.     float fy2;
  445.     float fy1;
  446.     float fx2;
  447.     float fx1;
  448.     float Pw1;
  449.     float Pw2;
  450.     float ENV1TOVCF;
  451.     float LFOTOVCF;
  452.     float LFOTOVCF2;
  453.     float LFO1TOPW1;
  454.     float LFO2TOPW1;
  455.     float LFO1TOPW2;
  456.     float LFO2TOPW2;
  457.  
  458.     int VReso;    
  459.     float Vcf_Cutoff;
  460.     float Vcf_Resonance;
  461.     char Vcf_Hpf;
  462.     char sm;
  463.     float Fine,Detune;
  464.     union res_acc
  465.     {
  466.     unsigned __int16 short_acc[2];
  467.     unsigned __int32 long_acc;
  468.     };
  469.     float OSC1_Position;
  470.     float OSC2_Position;
  471.  
  472.     char OSC1,OSC2;
  473.     float Noise;
  474.     float OSC1_Volume;
  475.     char  ENV1_Stage;
  476.     int ENV1_Counter;
  477.     float CVol;
  478.     float TVol;
  479.     float ENV1_Val;
  480.     int Period;    
  481.     int Period2;    
  482.     int Gr,Gr2;
  483.     int SubGrCounter,SubGrCounter2;
  484.     int SubGrMax,SubGrMax2;
  485.     float final;
  486.     int VCutoff;
  487. };
  488.  
  489. DLL_EXPORTS
  490.  
  491. mi::mi()
  492. {
  493.     GlobalVals = &gval;
  494.     TrackVals = tval;
  495.     AttrVals = NULL;
  496. }
  497.  
  498. mi::~mi()
  499. {
  500.  
  501. }
  502.  
  503. void mi::Init(CMachineDataInput * const pi)
  504. {
  505.     Vcf_Cutoff=1.0f;
  506.     Vcf_Resonance=0.0f;
  507.     Vcf_Hpf=0;
  508.     sm=0;
  509.     Fine=0.5;
  510.     VCutoff=0;
  511.     Detune=0.0f;
  512.     final=0;
  513.     OSC1=1;
  514.     OSC2=1;
  515.     Pw1=256;
  516.     Pw2=256;
  517.     ENV1_A=1024;
  518.     ENV1_D=22100;
  519.     ENV1_S=0.3f;
  520.     ENV1_R=22100;
  521.     ENV1TOVCF=0.0f;
  522.     LFOTOVCF=0.0f;
  523.     LFOTOVCF2=0.0f;
  524.     LFO1TOPW1=0.0f;
  525.     LFO2TOPW1=0.0f;
  526.     LFO1TOPW2=0.0f;
  527.     LFO2TOPW2=0.0f;
  528.     
  529.     VReso=0;
  530.     Noise=0;
  531.     Period=16;
  532.     Period2=16;
  533.     Gr=0;
  534.     Gr2=0;
  535.  
  536.     SubGrCounter=0;
  537.     SubGrCounter2=0;
  538.  
  539.     SubGrMax=200;
  540.     SubGrMax2=200;
  541.     
  542.     OSC1_Step=0;
  543.     OSC1_Position=0;
  544.     OSC2_Step=0;
  545.     OSC2_Position=0;
  546.     OSC1_Volume=1.0f;
  547.     ENV1_Stage=0;
  548.     ENV1_Counter=0;
  549.     CVol=0.0f;
  550.     TVol=0.0f;
  551.     ENV1_Val=0.0f;
  552.     buf0=0.0f;
  553.     buf1=0.0f;
  554.     fy2=0.0f;
  555.     fy1=0.0f;
  556.     fx2=0.0f;
  557.     fx1=0.0f;
  558.     }
  559.     MakeBW();
  560.     InitWavetable();
  561. }
  562.  
  563. void mi::Tick()
  564. {
  565.     sm=gval.sm;
  566.  
  567.     OSC1=gval.osc1;
  568.  
  569.     Pw1=(float)gval.pw1;
  570.  
  571.     OSC2=gval.osc2;
  572.  
  573.     Pw2=(float)gval.pw2;
  574.  
  575.     Noise=(float)gval.noise/128.0f;
  576.  
  577.     Fine=(float)gval.fine/128.0f;
  578.  
  579.     Detune=(float)gval.detune-64.0f;
  580.  
  581.     ENV1_A=(int)gval.env1_a*(int)gval.env1_a;
  582.         
  583.     ENV1_D=gval.env1_d*(int)gval.env1_d;
  584.  
  585.     ENV1_S=(float)gval.env1_s/128.0f;
  586.     
  587.     ENV1_R=gval.env1_r*(int)gval.env1_r;
  588.  
  589.     Vcf_Cutoff=(float)gval.vcf_cutoff/128.0f;
  590.  
  591.     Vcf_Resonance=(float)gval.vcf_resonance/128.0f;
  592.     VReso=f2i(Vcf_Resonance*127.0f);
  593.  
  594.     Vcf_Hpf=gval.vcf_hpf;
  595.  
  596.     ENV1TOVCF=((float)gval.env1tovcf-64.0f)/64.0f;
  597.  
  598.     Period = gval.lfo;
  599.     SubGrMax=(SamplesPerTick/3600)*Period;
  600.  
  601.     Period2 = gval.lfo2;
  602.     SubGrMax2=(SamplesPerTick/3600)*Period2;
  603.  
  604.     LFOTOVCF=((float)gval.lfotovcf-64.0f)/64.0f;
  605.     LFOTOVCF2=((float)gval.lfotovcf2-64.0f)/64.0f;
  606.     LFO1TOPW1=((float)gval.lfo1topw1-64.0f)*4;
  607.     LFO2TOPW1=((float)gval.lfo2topw1-64.0f)*4;
  608.     LFO1TOPW2=((float)gval.lfo1topw2-64.0f)*4;
  609.     LFO2TOPW2=((float)gval.lfo2topw2-64.0f)*4;
  610.  
  611.     if(tval[c].note!=NOTE_NO)
  612.         {
  613.             if(tval[c].note==NOTE_OFF)
  614.             {
  615.                 // Note off on track c
  616.                 ENV1_Stage[c]=4;
  617.                 TVol[c]=ENV1_S;
  618.                 ENV1_Counter[c]=1;
  619.             }
  620.             else
  621.             {
  622.                 // Note on on track c
  623.  
  624.             float tNote =(float) ((tval[c].note>>4)*12+(tval[c].note&0x0f)-1)-41;
  625.             SynthNote(c,tNote);
  626.             }
  627.         }
  628.         
  629.         if(tval[c].volume!=paraVolume.NoValue)
  630.             OSC1_Volume[c]=(float)tval[c].volume/128.0f;
  631.         
  632.     }
  633. }
  634.  
  635. bool mi::Work(float *psamples, int numsamples, int const)
  636. {
  637.     bool gotsomething = false;
  638. do{
  639.     final=0;
  640.     LfoAdvance();
  641.     for (int c = 0; c < numTracks; c++)
  642.     {
  643.         float freak=0;
  644.         if (ENV1_Stage[c]>0)
  645.         {
  646.             freak=SynthWork(c);
  647.             gotsomething=true;    
  648.         }
  649.         float FinalC=Vcf_Cutoff+SineTable[Gr]*LFOTOVCF+SineTable[Gr2]*LFOTOVCF2+ENV1_Val[c]*ENV1TOVCF;
  650.         
  651.         switch(Vcf_Hpf)
  652.         {
  653.         case 0:
  654.         VCutoff=f2i(FinalC*128.0f);
  655.         if (VCutoff>127)VCutoff=127;
  656.         if (VCutoff<0)VCutoff=0;
  657.  
  658.         coef[0]=coeftab[0][VCutoff][VReso][0];
  659.         coef[1]=coeftab[1][VCutoff][VReso][0];
  660.         coef[2]=coeftab[2][VCutoff][VReso][0];
  661.         coef[3]=coeftab[3][VCutoff][VReso][0];
  662.         coef[4]=coeftab[4][VCutoff][VReso][0];
  663.         freak=Filter2(freak++,c);
  664.         break;
  665.  
  666.         case 1:
  667.         VCutoff=f2i(FinalC*128.0f);
  668.         if (VCutoff>127)VCutoff=127;
  669.         if (VCutoff<0)VCutoff=0;
  670.  
  671.         coef[0]=coeftab[0][VCutoff][VReso][1];
  672.         coef[1]=coeftab[1][VCutoff][VReso][1];
  673.         coef[2]=coeftab[2][VCutoff][VReso][1];
  674.         coef[3]=coeftab[3][VCutoff][VReso][1];
  675.         coef[4]=coeftab[4][VCutoff][VReso][1];
  676.         freak=Filter2(freak++,c);
  677.         break;
  678.  
  679.         case 2:
  680.  
  681.         VCutoff=f2i(FinalC*128.0f);
  682.         if (VCutoff>127)VCutoff=127;
  683.         if (VCutoff<0)VCutoff=0;
  684.  
  685.         coef[0]=coeftab[0][VCutoff][VReso][2];
  686.         coef[1]=coeftab[1][VCutoff][VReso][2];
  687.         coef[2]=coeftab[2][VCutoff][VReso][2];
  688.         coef[3]=coeftab[3][VCutoff][VReso][2];
  689.         coef[4]=coeftab[4][VCutoff][VReso][2];
  690.         freak=Filter2(freak++,c);
  691.         break;
  692.  
  693.         case 3:
  694.  
  695.         VCutoff=f2i(FinalC*128.0f);
  696.         if (VCutoff>127)VCutoff=127;
  697.         if (VCutoff<0)VCutoff=0;
  698.  
  699.         coef[0]=coeftab[0][VCutoff][VReso][3];
  700.         coef[1]=coeftab[1][VCutoff][VReso][3];
  701.         coef[2]=coeftab[2][VCutoff][VReso][3];
  702.         coef[3]=coeftab[3][VCutoff][VReso][3];
  703.         coef[4]=coeftab[4][VCutoff][VReso][3];
  704.         freak=Filter2(freak++,c);
  705.         break;
  706.  
  707.         case 4:freak=Filter(c,freak,FinalC,Vcf_Resonance);break;
  708.  
  709.         }
  710.  
  711.  
  712.         final+=freak;
  713.     }
  714.     *psamples++=final;
  715. }while(--numsamples);
  716.  
  717.     return gotsomething;
  718. }
  719.  
  720. void mi::Stop()
  721. {
  722.     for (int c = 0; c < numTracks; c++)
  723.         ENV1_Stage[c]=0;
  724. }
  725.  
  726. void mi::InitWavetable()
  727. {
  728.     SineTable[c]=(float)sin((float)c*0.0174532f);
  729. }
  730.  
  731. }
  732.  
  733. void mi::SynthNote(char channel,float note)
  734. {
  735.     ENV1_Stage[channel]=1;
  736.     ENV1_Counter[channel]=0;
  737.     ENV1_Val[channel]=0.0f;
  738.     OSC1_Step[channel]=(float)pow(2.0,note/12.0f);
  739.     OSC2_Step[channel]=(float)pow(2.0,(note+Fine+Detune)/12.0f);
  740. }
  741.  
  742. float mi::SynthWork(char channel)
  743. {
  744.     
  745.     float OSC1Result=GetS(OSC1,OSC1_Position[channel],Pw1+SineTable[Gr]*LFO1TOPW1+SineTable[Gr2]*LFO2TOPW1);
  746.     OSC1_Position[channel]+=OSC1_Step[channel];
  747.     if(OSC1_Position[channel]>=512)OSC1_Position[channel]-=512;
  748.     
  749.     float OSC2Result=GetS(OSC2,OSC2_Position[channel],Pw2+SineTable[Gr]*LFO1TOPW2+SineTable[Gr2]*LFO2TOPW2);
  750.     OSC2_Position[channel]+=OSC2_Step[channel];
  751.     if(OSC2_Position[channel]>=512)OSC2_Position[channel]-=512;
  752.  
  753.     switch(ENV1_Stage[channel])
  754.     {
  755.     case 1:
  756.         ENV1_Counter[channel]++;
  757.         ENV1_Val[channel]+=ADSR_Coef(ENV1_S,1);
  758.         if (ENV1_Counter[channel]>=ENV1_A)
  759.         {
  760.             ENV1_Counter[channel]=1;
  761.             ENV1_Stage[channel]=2;
  762.         }
  763.     break;
  764.  
  765.     case 2:
  766.         ENV1_Counter[channel]++;
  767.         ENV1_Val[channel]-=ADSR_Coef(ENV1_S,2);
  768.         
  769.         if (ENV1_Counter[channel]>=ENV1_D)
  770.         {
  771.             ENV1_Counter[channel]=1;
  772.             if (ENV1_S<0.01f)
  773.             ENV1_Stage[channel]=5;
  774.             else
  775.             ENV1_Stage[channel]=3;
  776.         }
  777.     break;
  778.     
  779.     case 3:
  780.     ENV1_Val[channel]=ENV1_S;
  781.     break;
  782.  
  783.     case 4:
  784.         ENV1_Counter[channel]++;
  785.         ENV1_Val[channel]-=ADSR_Coef(ENV1_S,4);
  786.         
  787.         if (ENV1_Counter[channel]>=ENV1_R)
  788.         {
  789.             ENV1_Counter[channel]=0;
  790.             ENV1_Stage[channel]=5;
  791.         }
  792.     break;
  793.     }
  794.  
  795.     if (ENV1_Stage[channel]<5)
  796.     {
  797.     TVol[channel]=OSC1_Volume[channel]*ENV1_Val[channel];
  798.     }
  799.     else
  800.     {
  801.     TVol[channel]=0.0f;
  802.     if (CVol[channel]<0.0002f)ENV1_Stage[channel]=0;
  803.     }
  804.  
  805.     float ad=TVol[channel]-CVol[channel];
  806.  
  807.     if (ad>0.00001f || ad<-0.00001f)
  808.         CVol[channel]+=ad/256.0f;
  809.     float Noiser=Noise*(rand()-16384.0f);
  810.     
  811.     float OSCSResults;
  812.     switch (sm){
  813.     case 0:
  814.     OSCSResults=OSC1Result+OSC2Result;
  815.     break;
  816.     case 1:
  817.     OSCSResults=OSC1Result-OSC2Result;
  818.     break;
  819.     case 2:
  820.     OSCSResults=OSC1Result*(OSC2Result/32768.0f);
  821.     break;
  822.     case 3:
  823.     OSCSResults=float(f2i(OSC1Result) & f2i(OSC2Result));
  824.     break;
  825.     case 4:
  826.     OSCSResults=float(f2i(OSC1Result) | f2i(OSC2Result));
  827.     break;
  828.     
  829.     }
  830.     return (Noiser+OSCSResults)*CVol[channel];
  831.     
  832. }
  833.  
  834. float mi::ADSR_Coef(float sustain,int stage)
  835. {
  836.     float coef=0.0f;
  837.  
  838.     switch(stage)
  839.     {
  840.     case 1:
  841.         coef=(float)1.0f/(float)ENV1_A;
  842.     break;
  843.     
  844.     case 2:
  845.         coef=(1.0f-sustain)/(float)ENV1_D;
  846.     break;
  847.     
  848.     case 3:
  849.         coef=0;
  850.     break;
  851.  
  852.     case 4:
  853.         coef=sustain/(float)ENV1_R;
  854.     break;
  855.     }
  856.     return coef;
  857. }
  858.  
  859. float mi::Filter(char c,float input,float f,float q)
  860. {
  861.   input++;
  862.   if (f>0.95f)f=0.95f;
  863.   if (f<0.05f)f=0.05f;
  864.   if (q>0.95f)q=0.95f;
  865.   if (q<0.05f)q=0.05f;
  866.   
  867.   float fa = 1.0f - f; 
  868.   float fb = q * (1.0f + 1.0f/fa);
  869.   buf0[c] = fa * buf0[c] + f * (input + fb * (buf0[c] - buf1[c])); 
  870.   buf1[c] = fa * buf1[c] + f * buf0[c];
  871.   return buf1[c];  
  872. }
  873.  
  874. void mi::LfoAdvance(void)
  875. {
  876.         SubGrCounter++;
  877.         SubGrCounter2++;
  878.         
  879.         if(SubGrCounter>SubGrMax){
  880.             SubGrCounter=0;
  881.             Gr++;
  882.             if(Gr>359)
  883.                 Gr=0;
  884.         }
  885.         
  886.         if(SubGrCounter2>SubGrMax2){
  887.             SubGrCounter2=0;
  888.             Gr2++;
  889.             if(Gr2>359)
  890.                 Gr2=0;
  891.         }
  892. }
  893.  
  894.  
  895. int mi::f2i(double d)
  896. {
  897.   const double magic = 6755399441055744.0; // 2^51 + 2^52
  898.   double tmp = (d-0.5) + magic;
  899.   return *(int*) &tmp;
  900. }
  901.  
  902. char const *mi::DescribeValue(int const param, int const value)
  903. {
  904.     static char txt[16];
  905.  
  906.     switch(param)
  907.     {
  908.     case 0:
  909.     switch(value)
  910.         {
  911.         case 0: return "Add";break;
  912.         case 1: return "Sub";break;
  913.         case 2: return "AM";break;
  914.         case 3: return "And";break;
  915.         case 4: return "Or";break;
  916.         }
  917.     break;
  918.     case 1:
  919.         switch(value)
  920.         {
  921.         case 0: return "Sine";break;
  922.         case 1: return "Sawtooth";break;
  923.         case 2: return "Pulse";break;
  924.         case 3: return "PW Value";break;
  925.         case 4: return "-Sawtooth";break;
  926.         case 5: return "RndWave";break;
  927.         case 6: return "None";break;
  928.         case 7: return "None";break;
  929.         case 8: return "Off";break;
  930.         }
  931.     break;
  932.  
  933.     case 3:
  934.         switch(value)
  935.         {
  936.         case 0: return "Sine";break;
  937.         case 1: return "Sawtooth";break;
  938.         case 2: return "Pulse";break;
  939.         case 3: return "PW Value";break;
  940.         case 4: return "-Sawtooth";break;
  941.         case 5: return "RndWave";break;
  942.         case 6: return "None";break;
  943.         case 7: return "None";break;
  944.         case 8: return "Off";break;
  945.         }
  946.     break;
  947.  
  948.     case 5:
  949.         sprintf(txt, "%2.1f%%", (float)value*0.78125f);
  950.     break;
  951.     
  952.     case 6:
  953.         sprintf(txt, "%d Units", value);
  954.     break;
  955.     
  956.     case 7:
  957.         sprintf(txt, "%d SemiTns.", (int)value-64);
  958.     break;
  959.  
  960.     case 10:
  961.         sprintf(txt, "%2.1f%%", (float)value*0.78125f);
  962.     break;
  963.  
  964.     case 12:
  965.         sprintf(txt, "%2.1f Ticks", (float)value/10.0f);
  966.     break;
  967.     
  968.     case 13:
  969.         sprintf(txt, "%2.1f Ticks", (float)value/10.0f);
  970.     break;
  971.  
  972.     case 16:
  973.         switch(value)
  974.         {
  975.         case 0: return "LP12";break;
  976.         case 1: return "HP";break;
  977.         case 2: return "BP";break;
  978.         case 3: return "BR";break;
  979.         case 4: return "LP24";break;
  980.         case 5: return "Off";break;
  981.         }
  982.     break;
  983.  
  984.     case 17:
  985.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  986.     break;
  987.  
  988.     case 18:
  989.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  990.     break;
  991.  
  992.     case 19:
  993.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  994.     break;
  995.  
  996.     case 20:
  997.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  998.     break;
  999.  
  1000.     case 21:
  1001.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  1002.     break;
  1003.  
  1004.     case 22:
  1005.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  1006.     break;
  1007.  
  1008.     case 23:
  1009.         sprintf(txt, "%2.1f%%", ((float)value-64.0f)*1.5625f);
  1010.     break;
  1011.  
  1012.  
  1013.     default:
  1014.     return NULL;
  1015.     }
  1016.     return txt;
  1017. }
  1018.  
  1019. void mi::MakeBW(void)
  1020. {
  1021. for (int cutt=0;cutt<128;cutt++)
  1022. {
  1023. for (int rezz=0;rezz<128;rezz++)
  1024. {
  1025. for (int typp=0;typp<4;typp++)
  1026. {
  1027. ComputeCoefs(cutt,rezz,typp);
  1028. coeftab[0][cutt][rezz][typp]=coef[0];        
  1029. coeftab[1][cutt][rezz][typp]=coef[1];
  1030. coeftab[2][cutt][rezz][typp]=coef[2];
  1031. coeftab[3][cutt][rezz][typp]=coef[3];
  1032. coeftab[4][cutt][rezz][typp]=coef[4];
  1033. }}}
  1034.  
  1035. }
  1036.  
  1037. void mi::ComputeCoefs(int freq, int r, int t)
  1038. {
  1039.     float omega =float (2*PI*Kutoff(freq)/44100);
  1040.     float sn = (float)sin( omega);
  1041.     float cs = (float)cos( omega);
  1042.     float alpha;
  1043.         
  1044.     if( t<2)
  1045.     alpha =float(sn / Reonance( r *(freq+70)/(127.0f+70)));
  1046.     else
  1047.     alpha =float (sn * sinh( Bandwidth( r) * omega/sn));
  1048.  
  1049.         float a0, a1, a2, b0, b1, b2;
  1050.  
  1051.         switch( t)
  1052.         {
  1053.     
  1054.         case 0: // LP
  1055.                 b0 =  (1 - cs)/2;
  1056.                 b1 =   1 - cs;
  1057.                 b2 =  (1 - cs)/2;
  1058.                 a0 =   1 + alpha;
  1059.                 a1 =  -2*cs;
  1060.                 a2 =   1 - alpha;
  1061.                 break;
  1062.         case 1: // HP
  1063.                 b0 =  (1 + cs)/2;
  1064.                 b1 = -(1 + cs);
  1065.                 b2 =  (1 + cs)/2;
  1066.                 a0 =   1 + alpha;
  1067.                 a1 =  -2*cs;
  1068.                 a2 =   1 - alpha;
  1069.                 break;
  1070.         case 2: // BP
  1071.                 b0 =   alpha;
  1072.                 b1 =   0;
  1073.                 b2 =  -alpha;
  1074.                 a0 =   1 + alpha;
  1075.                 a1 =  -2*cs;
  1076.                 a2 =   1 - alpha;
  1077.                 break;
  1078.         case 3: // BR
  1079.                 b0 =   1;
  1080.                 b1 =  -2*cs;
  1081.                 b2 =   1;
  1082.                 a0 =   1 + alpha;
  1083.                 a1 =  -2*cs;
  1084.                 a2 =   1 - alpha;
  1085.                 break;
  1086.         }
  1087.  
  1088.         coef[0] = b0/a0;
  1089.         coef[1] = b1/a0;
  1090.         coef[2] = b2/a0;
  1091.         coef[3] = -a1/a0;
  1092.         coef[4] = -a2/a0;
  1093. }
  1094.     
  1095.  
  1096. float mi::Kutoff( int v)
  1097. {
  1098.         return float(pow( (v+5)/(127.0+5), 1.7)*13000+30);
  1099. }
  1100.  
  1101. float mi::Reonance( float v)
  1102. {
  1103.         return float(pow( v/127.0, 4)*150+0.1);
  1104. }
  1105.  
  1106. float mi::Bandwidth( int v)
  1107. {
  1108.         return float(pow( v/127.0, 4)*4+0.1);
  1109. }
  1110.  
  1111. float mi::Filter2(float x)
  1112. {
  1113.         float y;
  1114.         y = coef[0]*x + coef[1]*fx1 + coef[2]*fx2 + coef[3]*fy1 + coef[4]*fy2;
  1115.         fy2=fy1;
  1116.         fy1=y;
  1117.         fx2=fx1;
  1118.         fx1=x;
  1119.         return y;
  1120. }
  1121.  
  1122. float mi::GetS(int type,float offset, float pwi)
  1123. {
  1124. switch(type)
  1125.     {
  1126.         case 0: return (float)sin(offset*0.0122718f)*16384;break;
  1127.         case 1: return (offset-256)*64.0f;break;
  1128.         case 2: 
  1129.             if (pwi<2)pwi=2;
  1130.             if (pwi>510)pwi=510;
  1131.  
  1132.             if (offset<pwi)
  1133.             return 16384;
  1134.             else
  1135.             return -16384;
  1136.         break;
  1137.         
  1138.         case 3: return (pwi-256)*64;break;
  1139.         case 4: return (offset-256)*-64.0f;break;
  1140.         
  1141.         case 5:
  1142.             if (pwi<2)pwi=2;
  1143.             if (pwi>510)pwi=510;
  1144.  
  1145.             if (offset<pwi)
  1146.             return (float)rand()-8192;
  1147.             else
  1148.             return 0;
  1149.         break;
  1150.         
  1151.         case 6: return 0;break;
  1152.         case 7: return 0;break;
  1153.         case 8: return 0;break;
  1154.         default:
  1155.             return 0;
  1156.         break;
  1157.     }
  1158. }
  1159. */
  1160.